package com.liu.webstore.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author LiuYumei
 * @Date 2022/7/31 21:57
 */
//@Component
//@Aspect
public class DemoAspect {
    /**
     * 表达式解释：
     *  第一个* 表示方法返回值
     *  com.liu.webstore.service包下的所有类的所有方法的所有参数(..)
     *  都要处理
     */
    @Pointcut("execution(* com.liu.webstore.service.*.*(..))")
    public void pointcut() {

    }

    @Before("pointcut()")
    public void before() {
        System.out.println("before 返回前织入一些逻辑");
    }

    @After("pointcut()")
    public void after() {
        System.out.println("after 返回后织入一些逻辑");
    }

    /**
     * @param joinPoint（织入的部位，连接点）
     */
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around before");
        // 调用目标组件的方法（目标对象被处理的方法）
        Object obj = joinPoint.proceed();
        System.out.println("around after");
        return obj;
    }

    @AfterReturning("pointcut()")
    public void afterReturning() {
        System.out.println("afterReturning 正常返回后织入一些逻辑");
    }

    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        System.out.println("afterThrowing 异常返回后织入一些逻辑");
    }
}
